package org.example.mall.admin.controller.manage;


import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.example.mall.admin.model.dto.manage.RoleMenuDto;
import org.example.mall.admin.model.entity.manage.Role;
import org.example.mall.admin.service.manage.RoleService;
import org.example.mall.admin.util.BusOp;
import org.example.mall.admin.util.R;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 系统角色表 前端控制器
 * </p>
 *
 * @author hzq
 * @since 2021-12-29
 */
@Api(tags = "角色管理")
@RestController
@RequestMapping("/manage/role")
@AllArgsConstructor
public class RoleController {

    private final RoleService roleService;

    /**
     * 分页查询角色信息
     *
     * @param page 分页对象
     * @param role 查询条件
     * @return 角色列表
     */
    @GetMapping("/page")
    @ApiOperation("分页查询角色信息")
    public R getRolePage(Page page, Role role) {
        return R.ofSuccess(roleService.page(page, Wrappers.query(role)));
    }

    @ApiOperation("角色分组列表")
    @GetMapping("/roleGroup")
    public R<List<Map<String, Object>>> roleGroup() {
        return R.ofSuccess(roleService.roleGroup());
    }

    /**
     * 新建角色
     *
     * @param role 角色信息
     * @return 角色信息
     */
    @PostMapping
    @ApiOperation("新建角色")
    @PreAuthorize("hasAuthority('role_add')")
    public R<Role> add(@RequestBody @Valid Role role) {
        BusOp.mustSucceed(roleService.save(role), "新建角色失败");
        return R.ofSuccess("新建角色成功", role);
    }

    /**
     * 更新角色
     *
     * @param role 角色信息
     * @return 更新结果
     */
    @PutMapping
    @ApiOperation("更新角色")
    @PreAuthorize("hasAuthority('role_edit')")
    public R<Boolean> edit(@RequestBody @Valid Role role) {
        // 不允许修改客户端id
        role.setClientId(null);
        return R.ofSuccess("更新角色成功",
                BusOp.mustSucceed(roleService.updateById(role), "更新角色失败"));
    }

    /**
     * 删除角色
     *
     * @param roleId 角色id
     * @return 删除结果
     */
    @ApiOperation("删除角色")
    @DeleteMapping("/{roleId}")
    @PreAuthorize("hasAuthority('role_del')")
    public R<Boolean> del(@PathVariable Integer roleId) {
        return R.ofSuccess("删除角色成功",
                BusOp.mustSucceed(roleService.delById(roleId), "删除角色失败"));
    }

    /**
     * 角色分配权限
     *
     * @param dto 分配信息
     * @return 分配结果
     */
    @PutMapping("/menu")
    @ApiOperation("角色分配权限")
    @PreAuthorize("hasAuthority('role_perm')")
    public R<Boolean> perm(@RequestBody @Valid RoleMenuDto dto) {
        return R.ofSuccess("分配权限成功",
                BusOp.mustSucceed(roleService.permRoleMenus(dto), "分配权限失败"));
    }

}

